<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>3.2.3_高阶函数实现AOP</title>
  </head>
  <body>
    <script>
      // JavaScript中AOP值把一个函数“动态织入”到另一个函数中
      Function.prototype.before = function (beforefn) {
        var _self = this // 保存原函数的引用
        return function () {
          beforefn.apply(this, arguments) // 执行新函数，修正this
          return _self.apply(this, arguments) // 执行原函数
        }
      }

      Function.prototype.after = function (afterfn) {
        var _self = this
        return function () {
          var ret = _self.apply(this, arguments) // 原函数
          afterfn.apply(this, arguments)
          return ret
        }
      }

      var func = function () {
        console.log(2)
      }

      func = func
        .before(function () {
          console.log(1)
        })
        .after(function () {
          console.log(3)
        })

      func() // 1 2 3
    </script>
  </body>
</html>
